#include <stdio.h>
//顺序栈
#define MaxSize 50
typedef int ElemType;
typedef struct {
    ElemType data[MaxSize];  //数组
    int top;   //始终指向栈顶的一个变量
}SqStack;

void InitStack(SqStack &S)
{
    S.top=-1;  //初始化栈，就是S.top=-1,让栈空
}
bool StackEmpty(SqStack S)
{
    if(S.top==-1)
    {
        return true;
    } else{
        return false;
    }

}
// 入栈（增）
bool Push(SqStack &S,ElemType x)
{
    //判断栈是否满了
    if(S.top==MaxSize-1)
    {
        return false;
    }
    S.data[++S.top]=x;   //等价于S.top=S.top+1;  S.data[S.top]=x;
    return true;
}
// 获取栈顶元素
bool GetTop(SqStack S,ElemType &m)
{
    if(StackEmpty(S))
    {
        return false;
    }
    m=S.data[S.top];  //拿栈顶元素
    return true;
}
// 弹栈
bool Pop(SqStack &S,ElemType &m)
{
    if(StackEmpty(S))
    {
        return false;
    }
    m=S.data[S.top--];  //出栈  后减减相当于m=S.data[S.top];  S.top=S.top-1；
                        //例，三个元素的栈，出栈一次后top变为1，下一次入栈将覆盖top为2的元素
    return true;
}
int main() {
    SqStack S;
    InitStack(S);

    bool flag;
    flag=StackEmpty(S);
    if(flag)
    {
        printf("SqStack is empty!\n");
    }
    Push(S,1);  //入栈
    Push(S,2);
    Push(S,3);

    ElemType m;
    flag=GetTop(S,m);   //获取栈顶元素
    if(flag)
    {
        printf("get top %d\n",m);
    }
    flag=Pop(S,m);
    if(flag)
    {
        printf("pop element is %d\n",m);
    }
    return 0;
}
